home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / lib / picture / pictureGL.cpp < prev   
Encoding:
C/C++ Source or Header  |  2000-03-20  |  2.8 KB  |  110 lines

  1. #include "../Fly3D.h"
  2.  
  3. textcacheGL::textcacheGL()
  4. {
  5.     tex=0;
  6. }
  7.  
  8. textcacheGL::~textcacheGL()
  9. {
  10.     reset();
  11. }
  12.  
  13. void textcacheGL::reset()
  14. {
  15.     int i;
  16.     for( i=0;i<npic;i++ )
  17.         free_tex(i);
  18.     if (tex)
  19.         {
  20.         glDeleteTextures(npic,tex);
  21.         delete tex;
  22.         }
  23.     tex=0;
  24.     npic=0;
  25. }
  26.  
  27. void textcacheGL::init(int np,picture **pic)
  28. {
  29.     reset();
  30.     
  31.     if (np)
  32.         {
  33.         npic=np;
  34.         tex=new unsigned[npic];
  35.         glGenTextures(npic,tex);
  36.         for( int i=0;i<npic;i++)
  37.             if (pic[i]->buf)
  38.                 load_tex(i,pic[i]->sx,pic[i]->sy,pic[i]->bytespixel,pic[i]->buf[0]);
  39.         memset(curpic,-1,sizeof(int)*MAX_TEXTURE_UNITS);
  40.         }
  41. }
  42.  
  43. void textcacheGL::load_tex(int pic,int sx,int sy,int bytespixel,unsigned char *buf)
  44. {
  45.     glBindTexture(GL_TEXTURE_2D,tex[pic]);
  46.     if (bytespixel==4)
  47.         glTexImage2D(GL_TEXTURE_2D,0,4,sx,sy,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
  48.     else 
  49.         glTexImage2D(GL_TEXTURE_2D,0,3,sx,sy,0,GL_RGB,GL_UNSIGNED_BYTE,buf);
  50.  
  51.     if (mipmap)
  52.     {
  53.         if (bytespixel==4)
  54.             gluBuild2DMipmaps(GL_TEXTURE_2D,4,sx,sy,GL_RGBA,GL_UNSIGNED_BYTE,buf);
  55.         else
  56.             gluBuild2DMipmaps(GL_TEXTURE_2D,3,sx,sy,GL_RGB,GL_UNSIGNED_BYTE,buf);
  57.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,textfilter?GL_LINEAR_MIPMAP_LINEAR:GL_NEAREST);
  58.     }
  59.     else
  60.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,textfilter?GL_LINEAR:GL_NEAREST);
  61.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,textfilter?GL_LINEAR:GL_NEAREST);
  62. }
  63.  
  64. void textcacheGL::free_tex(int pic)
  65. {
  66.     glBindTexture(GL_TEXTURE_2D,tex[pic]);
  67.     glTexImage2D(GL_TEXTURE_2D,0,3,0,0,0,GL_RGB,GL_UNSIGNED_BYTE,0);
  68. }
  69.  
  70. int textcacheGL::add_picture(int sx,int sy,int bytespixel,unsigned char *buf)
  71. {
  72.     unsigned *tmp=new unsigned[npic+1];
  73.     if (tex)
  74.         {
  75.         memcpy(tmp,tex,sizeof(unsigned)*npic);
  76.         delete tex;
  77.         }
  78.     tex=tmp;
  79.     
  80.     glGenTextures(1,&tex[npic]);
  81.  
  82.     glBindTexture(GL_TEXTURE_2D,tex[npic]);
  83.     if (bytespixel==4)
  84.         glTexImage2D(GL_TEXTURE_2D,0,4,sx,sy,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
  85.     else 
  86.         glTexImage2D(GL_TEXTURE_2D,0,3,sx,sy,0,GL_RGB,GL_UNSIGNED_BYTE,buf);
  87.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,textfilter?GL_LINEAR:GL_NEAREST);
  88.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,textfilter?GL_LINEAR:GL_NEAREST);
  89.  
  90.     return npic++;
  91. }
  92.  
  93. void textcacheGL::update_picture(int picnum,int sx,int sy,int bytespixel,unsigned char *buf)
  94. {
  95.     glBindTexture(GL_TEXTURE_2D,tex[picnum]);
  96.     if (bytespixel==4)
  97.         glTexImage2D(GL_TEXTURE_2D,0,4,sx,sy,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
  98.     else 
  99.         glTexImage2D(GL_TEXTURE_2D,0,3,sx,sy,0,GL_RGB,GL_UNSIGNED_BYTE,buf);
  100. }
  101.  
  102. void textcacheGL::update_sub_picture(int picnum,int x,int y,int sx,int sy,int bytespixel,unsigned char *buf)
  103. {
  104.     glBindTexture(GL_TEXTURE_2D,tex[picnum]);
  105.     if (bytespixel==4)
  106.         glTexSubImage2D(GL_TEXTURE_2D,0,x,y,sx,sy,GL_RGBA,GL_UNSIGNED_BYTE,buf);
  107.     else 
  108.         glTexSubImage2D(GL_TEXTURE_2D,0,x,y,sx,sy,GL_RGB,GL_UNSIGNED_BYTE,buf);
  109. }
  110.